篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java全栈数据库技术:1.数据库之MysqlL上相关的知识,希望对你有一定的参考价值。
DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。
DB:数据库(Database)
SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。
如果把数据库
比作盘子
,那数据就是盘子里的菜
,SQL
则是你的筷子
。
数据库类型:数据库经过几十年的发展,出现了多种类型。目前最常见的数据库模型主要是:关系型数据库和(noSQL)非关系型数据库。
mysql:其中的一款关系型数据库管理系统
以下是2020年DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:(查看数据库最新排名:)
关系型数据库模型是将复杂的数据结构用较为简单的二元关系(二维表)来表示,如图所示。在该类型数据库中,对数据的操作基本上都建立在一个或多个表格上,我们可以采用结构化查询语言(SQL)对数据库进行操作。关系型数据库是目前主流的数据库技术,其中具有代表性的数据库管理系统有:Oracle、DB2、SQL Server、MySQL等。
非关系型数据库:
随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS( 社交网络服务 )类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。 例如:redis MongoDB
遵循ER模型
具体体现
MySQL数据库最初是由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购。2009年,SUN又被Oracle收购。MySQL是目前IT行业最流行的开放源代码的数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统。MySQL之所以受到业界人士的青睐,主要是因为其具有以下几方面优点:
MySQL最强大的优势之一在于它是一个开放源代码的数据库管理系统。开源的特点是给予了用户根据自己需要修改DBMS的自由。MySQL采用了General Public License,这意味着授予用户阅读、修改和优化源代码的权利,这样即使是免费版的MySQL的功能也足够强大,这也是为什么MySQL越来越受欢迎的主要原因。
MySQL可以在不同的操作系统下运行,简单地说,MySQL可以支持Windows系统、UNIX系统、Linux系统等多种操作系统平台。这意味着在一个操作系统中实现的应用程序可以很方便地移植到其他的操作系统下。
MySQL的核心程序完全采用多线程编程,这些线程都是轻量级的进程,它在灵活地为用户提供服务的同时,又不会占用过多的系统资源。因此MySQL能够更快速、高效的处理数据。
MySQL分为社区版和企业版,社区版是完全免费的,而企业版是收费的。即使在开发中需要用到一些付费的附加功能,价格相对于昂贵的Oracle、DB2等也是有很大优势的。其实免费的社区版也支持多种数据类型和正规的SQL查询语言,能够对数据进行各种查询、增加、删除、修改等操作,所以一般情况下社区版就可以满足开发需求了,而对数据库可靠性要求比较高的企业可以选择企业版。
不讲解,用到时百度搜索就行
“我的电脑/计算机”–>右键–>“管理”–>“服务”–>启动和关闭MySQL服务
“开始菜单”–>“控制面板”–>“管理工具”–>“服务”–>启动和关闭MySQL
“任务管理器”–>“服务”–>启动和关闭MySQL
或者
命令行(使用命令行的前提需要配置mysql的环境变量)
net start MySQL服务名
net stop MySQL服务名
1、命令行客户端:
mysql -h 主机IP地址 -P 端口号 -u 用户名 -p回车
Enter Password:密码
如果访问本机,-h localhost可以省略
如果端口号没有修改,-P 3306可以省略
除了-p与密码之间不要空格外,其他的-h,-P,-u与后面的参数值之间可以有空格
想要连接成功,必须保证服务开启的
2、其他客户端,例如:可视化工具Navicat或SQLyog等
int(M),必须和unsigned zerofill一起使用才有意义
* 1个字节(byte) = 8比特(bit),可以表示256个数。一个bit就是一位二进制数
* TINYINT:有符号(-128~127);无符号(0~255)
* 其他类似
* int(4)字段仍然可以接收超过4位的整数,因为mysql默认使用的是有符号类型。而在有符号类型的字段中,整数类型设置的宽度不生效。
* int(M),必须和`unsigned zerofill`一起使用才有意义。unsigned zerofill表示无符号字段,不符合要求的地方以0填充,例如:宽度为3,数值为10,则显示为010.当然还是可以接收超过3位的整数
double(M,D):表示最长为M位,其中小数点后D位
例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。
decimal(M,D):表示最长为M位,其中小数点后D位
如果decimal没有指定宽度,则只保留整数,且会对小数四舍五入
如果指定了宽度,则按宽度输出,多出的小数也会按照四舍五入
字节范围是:1-8,值范围是:bit(1)~bit(64),默认bit(1) 将传入的数值转为二进制存入
用来存储二进制数。对于位字段,直接使用select命令将不会看到结果。可以使用bit()函数进行插入。插入bit类型字段时,使用bit()函数转为二进制值再插入,使用bin()函数进行读取。
日期时间类型:year, date, datetime, timestamp
注意一下每一种日期时间的表示范围
timestamp和datetime的区别:
timestamp范围比较小
timestamp和时区有关
表中的第一个非空的timestamp字段如果插入和更新为NULL则会自动设置为系统时间
案例:
create table test2(time1 datetime,time2 timestamp); # 创建表
insert into test2 values(now(),now()); # 插入数据
select * from test2; // 查询数据
+---------------------+---------------------+
| time1 | time2 |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 02:09:52 |
+---------------------+---------------------+
1 row in set (0.01 sec)
insert into test2 values(null,null);
select * from test2;
+---------------------+---------------------+
| time1 | time2 |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 02:09:52 |
| NULL | NULL |
+---------------------+---------------------+
# 修改时区
set time_zone="+9:00";
select * from test2;
+---------------------+---------------------+
| time1 | time2 |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 11:09:52 | # 修改时区后,timestamp日期类型的数据也会自动改变。datetime类型的不会
| NULL | NULL |
+---------------------+---------------------+
MySQL中提供了多种对字符数据的存储类型,不同的版本可能有所差异。常见的有:
char,varchar,xxtext,binary,varbinary,xxblob,enum,set等等
在mysql中,单引号和双引号都表示字符串
char如果没有指定宽度,默认为1个字符。定长字符串
varchar(M),必须指定宽度。可变字符串
binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的。
一般在保存少量字符串的时候,我们会选择char和varchar;而在保存较大文本时,通常会选择使用text或blob系列。blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时,会在数据表中留下很大的“空洞”,为了提高性能,建议定期时候用optimize table功能对这类表进行碎片整理。可以使用合成的(Synthetic)索引来提高大文本字段的查询性能,如果需要对大文本字段进行模糊查询,MySql提供了前缀索引。但是仍然要在不必要的时候避免检索大型的blob或text值。
enum枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对于1~255个成员的枚举需要1个字节存储;对于255`65535个成员需要2个字节存储。例如:gender enum(‘男’,‘女’)。一次只能从枚举值中选择一个。
set集合类型,可以包含0~64个成员。一次可以从集合中选择多个成员。如果选择了1-8个成员的集合,占1个字节,依次占2个,3个。。8个字节。例如:hoppy set(‘吃饭’,‘睡觉’,‘玩游戏’,‘旅游’),选择时’吃饭,睡觉’或’睡觉,玩游戏,旅游’
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| eid | int(11) | NO | PRI | NULL | auto_increment |
| ename | varchar(20) | NO | | NULL | |
| tel | char(11) | NO | | NULL | |
| gender | char(1) | YES | | 男 | |
| salary | double | YES | | NULL | |
| commission_pct | double(3,2) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| job_id | int(11) | YES | | NULL | |
| email | varchar(32) | YES | | NULL | |
| mid | int(11) | YES | | NULL | |
| address | varchar(150) | YES | | NULL | |
| native_place | varchar(10) | YES | | NULL | |
| did | int(11) | YES | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
# char varchar练习
create table test2(
name1 char, # 未指定宽度,则只能放一个字符
name2 char(20), # 指定宽度时,与varchar一样。都可以存放宽度以内的字符串,但是char底层是定长的,即只放2个字符底层仍然会占用20个字符的空间
name3 varchar(20) # 必须指定宽度,底层是可变的,即存放多少字符就占用多少空间。只要不超过宽度
);
insert into test2 values("男","嘿嘿","哈哈哈");
select * from test2;
+-------+--------+-----------+
| name1 | name2 | name3 |
+-------+--------+-----------+
| 男 | 嘿嘿 | 哈哈哈 |
+-------+--------+-----------+
# enum练习
create table test2(
sex enum("男","女","不男不女") # 只能在待选项中选择一个值
);
insert into test2 values("不男不女");
select * from test2;
+--------------+
| sex |
+--------------+
| 不男不女 |
+--------------+
insert into test2 values("公");
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
# set练习
create table test2(
// 1.可以选择集合中的一个或多个待选项
// 2.也可以使用数字选择待选项,从左到右依次是1,2,4,8,...(如果是5则表示:第一个和第三个待选项)
habby set("吃饭","睡觉","玩游戏","运动")
);
insert into test2 values("吃饭");
insert into test2 values("吃饭,睡觉");
select * from test2;
+---------------+
| habby |
+---------------+
| 吃饭 |
| 吃饭,睡觉 |
+---------------+
insert into test2 values(4); # 选择第三个待选项
insert into test2 values(12); # 选择第三、第四个待选项。(12=4+8)
select * from test2;
+------------------+
| habby |
+------------------+
| 吃饭 |
| 吃饭,睡觉 |
| 玩游戏 |
| 玩游戏,运动 |
+------------------+
1.查看当前数据库的编码方式
show variables like 'character%';
2.指定编码方式创建数据库
create database 数据库名 CHARSET "utf8";
3.一劳永逸的解决编码问题
1.找到数据库安装目录下的my.ini文件
2.将ini文件中的`default-character-set`设置为`utf8`
3.将ini文件下的`character-set-server`改为`utf8`
第四章 SQL
(1)mysql的sql语法不区分大小写
MySQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。
show variables like "coll%"; // 显示mysql的校验规则,查看数据值是否区分大小写
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
/**
\\_ci(大小写不敏感),\\_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)
*/
(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号
(3)建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来
(4)数据库和表名、字段名等对象名中间不要包含空格
(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名
(6)标点符号:
必须成对
必须英文状态下半角输入方式
字符串和日期类型可以使用单引号’’
列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略
如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。
(7)SQL脚本中如何加注释
单行注释:#注释内容
单行注释:–空格注释内容 其中–后面的空格必须有
多行注释:/* 注释内容 */
#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;
#创建表格
#create table student info(...); #表名错误,因为表名有空格
create table student_info(...);
#其中name使用``飘号,因为name和系统关键字或系统函数名等预定义标识符重名了。
CREATE TABLE t_stu(
id INT,
`name` VARCHAR(20)
);
select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略
select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略""
select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""
DDL (Data Definition Language) :数据定义语言,定义库,表结构等,包括create,drop,alter等
DML (Data Manipulation Language) :数据操作语言,增删改查数据,包括insert,delete,update,select等
DQL(Data query Language):数据查询语言 select
DCL(Data Control Language) :数据控制语言,权限,事务等管理。
1、查看所有数据库
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
5 rows in set (0.01 sec)
2、指定使用某个数据库
use 数据库名;
mysql> use test1;
Database changed
3、创建数据库
create database 数据库名;
create database 数据库名 charset 'utf8'; #在mysql中字符集名称不要使用utf-8
create database 数据库名 charset 'gbk';
create database test2;
Query OK, 1 row affected (0.02 sec)
4、删除数据库
drop database 数据库名;
mysql> drop database test2;
Query OK, 0 rows affected (0.02 sec)
5、查看某个库下的所有表格
show tables ; #前提是前面有use 数据库名;的语句
show tables from 数据库名;
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| test1 |
| test2 |
+-----------------+
2 rows in set (0.01 sec)
6、创建表格
create table 【数据名.】表名(
字段名1 数据类型,
字段名2 数据类型,
....
);
create table stu(
id int,
name varchar(10)
);
7、删除表格
drop table 【数据库名.]表名称;
mysql> drop table test2;
Query OK, 0 rows affected (0.04 sec)
8、查看某个表结构
describe 【数据库名.]表名称;
desc 【数据库名.]表名称;
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
9、增加一列
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 first;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 after 另一个字段;
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
alter table stu add school char(10); # 默认增加到末尾列
alter table stu add sex enum("男","女") first; # 增加到第一列
alter table stu add age int after id; # 增加到id字段后面
mysql> desc stu;
+--------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------+------+-----+---------+-------+
| sex | enum('男','女') | YES | | NULL | |
| id | int | YES | | NULL | |
| age | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| school | char(10) | YES | | NULL | |
+--------+-------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
10、删除一列
alter table 【数据库名.]表名称 drop 【column】 字段名;
alter table stu drop school; # 删除school列字段
mysql> desc stu;
+-------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| sex | enum('男','女') | YES | | NULL | |
| id | int | YES | | NULL | |
| age | int | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
11、修改列数据类型
alter table 【数据库名.]表名称 modify 【column】 字段名 新数据类型;
alter table stu modify name char(6); # 修改name字段数据类型
mysql> desc stu;
+-------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| sex | enum('男','女') | YES | | NULL | |
| id | int | YES | | NULL | |